package com.rafahead.firstdb.persist;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {

	private static final String TAG = "DBAdapter";
	private DatabaseHelper mDbHelper;
	private SQLiteDatabase mDb;

	private static final String DB_NAME = "FIRSTDB";
	private static final int DB_VERSION = 1;

	private Context mCtx;

	public static final String TABLE_CATEGORIA = "CATEGORIA";

	public static final String COLUNA_ID_CATEGORIA = "_id";
	public static final String COLUNA_DESCRICAO_CATEGORIA = "DESCRICAO";

	public static final String TABLE_EMPRESTIMO = "EMPRESTIMO";

	public static final String COLUNA_ID_EMPRESTIMOS = "_id";
	public static final String COLUNA_ITEM_EMPRESTIMOS = "ITEM";
	public static final String COLUNA_DESCRICAO_EMPRESTIMOS = "DESCRICAO";
	public static final String COLUNA_STATUS_EMPRESTIMOS = "STATUS";
	public static final String COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS = "DATA_DEVOLUCAO";
	public static final String COLUNA_STATUS_ALARME_EMPRESTIMOS = "STATUS_ALARME";
	public static final String COLUNA_ID_CATEGORIA_EMPRESTIMOS = "ID_CATEGORIA";
	public static final String COLUNA_ID_CONTATO_EMPRESTIMOS = "ID_CONTATO";
	public static final String COLUNA_CONTATO_EMPRESTIMOS = "CONTATO";

	public static final int STATUS_EMPRESTAR = 0;
	public static final int STATUS_PEGAR_EMPRESTADO = 1;

	public static final int STATUS_ALARME_LIGADO = 0;
	public static final int STATUS_ALARME_DESLIGADO = 1;


	private static final String TABLE_CREATE_CATEGORIA = "CREATE TABLE "
			+ TABLE_CATEGORIA + "  (" + COLUNA_ID_CATEGORIA
			+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
			+ COLUNA_DESCRICAO_CATEGORIA + " text not null);";

	private static final String TABLE_CREATE_EMPRESTIMO = "CREATE TABLE "
			+ TABLE_EMPRESTIMO + "  (" + COLUNA_ID_EMPRESTIMOS
			+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUNA_ITEM_EMPRESTIMOS
			+ " TEXT NOT NULL," + COLUNA_DESCRICAO_EMPRESTIMOS
			+ " TEXT NOT NULL," + COLUNA_STATUS_EMPRESTIMOS
			+ " INTEGER NOT NULL," + COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS
			+ " INTEGER NOT NULL," + COLUNA_STATUS_ALARME_EMPRESTIMOS
			+ " INTEGER NOT NULL," + COLUNA_ID_CATEGORIA_EMPRESTIMOS
			+ " INTEGER NOT NULL," + COLUNA_ID_CONTATO_EMPRESTIMOS
			+ " INTEGER," + COLUNA_CONTATO_EMPRESTIMOS + " TEXT, "
			+ " FOREIGN KEY ( " + COLUNA_ID_CATEGORIA_EMPRESTIMOS
			+ " )  REFERENCES " + TABLE_CATEGORIA + " (" + COLUNA_ID_CATEGORIA
			+ " ) ON DELETE RESTRICT ON UPDATE CASCADE);";

	private class DatabaseHelper extends SQLiteOpenHelper{

		public DatabaseHelper(Context context) {
			super(context, DB_NAME, null, DB_VERSION);
		}

		@Override
		public void onOpen(SQLiteDatabase db)
		{
			super.onOpen(db);
			if (!db.isReadOnly())
			{
				db.execSQL("PRAGMA foreign_keys=ON;");
			}
		}

		@Override
		public void onCreate(SQLiteDatabase db) {

			db.execSQL(TABLE_CREATE_CATEGORIA);
			db.execSQL(TABLE_CREATE_EMPRESTIMO);

			//Insere valores iniciais na tabela CATEGORIA
			ContentValues values = new ContentValues();
			values.put(COLUNA_DESCRICAO_CATEGORIA, "Todos");
			db.insert(TABLE_CATEGORIA, null, values);
			values.clear();
			values.put(COLUNA_DESCRICAO_CATEGORIA, "CDs");
			db.insert(TABLE_CATEGORIA, null, values);
			values.clear();
			values.put(COLUNA_DESCRICAO_CATEGORIA, "Livros");
			db.insert(TABLE_CATEGORIA, null, values);

			Log.w("DbAdapter","DB criado com sucesso!");
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w(TAG, "Atualizando o banco de dados da versão " + oldVersion
					+ " para " + newVersion
					+ ", todos os dados serão perdidos!");
			db.execSQL("DROP TABLE IF EXISTS " + TABLE_CATEGORIA);
			db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMPRESTIMO);
			onCreate(db);
		}


	}


	public DBAdapter open() throws SQLException {
		mDbHelper = new DatabaseHelper(mCtx);
		mDb = mDbHelper.getWritableDatabase();
		return this;
	}

	public void close() {
		mDbHelper.close();
		mDb.close();
	}

	public DBAdapter(Context ctx) {
		this.mCtx = ctx;
	}

	public long criarCategoria(String descricao) {
		ContentValues values = new ContentValues();
		values.put(COLUNA_DESCRICAO_CATEGORIA, descricao);

		return mDb.insert(TABLE_CATEGORIA, null, values);
	}

	public boolean removerCategoria(long idCategoria) {

		return mDb.delete(TABLE_CATEGORIA, COLUNA_ID_CATEGORIA + "=?",	new String[] { String.valueOf(idCategoria) }) > 0;
	}

	public boolean removerCategoria(long idCategoria, String descricao) {

		return mDb.delete(TABLE_CATEGORIA, COLUNA_ID_CATEGORIA + "=? AND "	+ COLUNA_DESCRICAO_CATEGORIA + "=?",new String[] { String.valueOf(idCategoria), descricao }) > 0;
	}

	public Cursor consultarTodasCategorias() {

		return mDb.query(TABLE_CATEGORIA, new String[] { COLUNA_ID_CATEGORIA,COLUNA_DESCRICAO_CATEGORIA }, null, null, null, null, null);
	}

	public Cursor consultarCategoria(long idCategoria) throws SQLException {

		Cursor mCursor = mDb.query(true, TABLE_CATEGORIA, new String[] { COLUNA_ID_CATEGORIA,COLUNA_DESCRICAO_CATEGORIA }, COLUNA_ID_CATEGORIA + "=?",
				new String[] { String.valueOf(idCategoria) }, null, null, null,	null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;

	}

	public boolean atualizarCategoria(long idCategoria, String descricao) {
		ContentValues values = new ContentValues();
		values.put(COLUNA_DESCRICAO_CATEGORIA, descricao);

		return mDb.update(TABLE_CATEGORIA, values, COLUNA_ID_CATEGORIA + "=?",	new String[] { String.valueOf(idCategoria) }) > 0;
	}

	public long criarEmprestimo(String item, String descricao,
			boolean statusEmprestimo, Date devolucao, boolean statusAlarme,
			long idCategoria, long idContato, String contato) {

		ContentValues values = new ContentValues();

		values.put(COLUNA_ITEM_EMPRESTIMOS, item);
		values.put(COLUNA_DESCRICAO_EMPRESTIMOS, descricao);
		values.put(COLUNA_STATUS_EMPRESTIMOS,
				statusEmprestimo ? STATUS_EMPRESTAR : STATUS_PEGAR_EMPRESTADO);
		values.put(COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS, devolucao.getTime());
		values.put(COLUNA_STATUS_ALARME_EMPRESTIMOS,
				statusAlarme ? STATUS_ALARME_LIGADO : STATUS_ALARME_DESLIGADO);
		values.put(COLUNA_ID_CATEGORIA_EMPRESTIMOS, idCategoria);
		values.put(COLUNA_ID_CONTATO_EMPRESTIMOS, idContato);
		values.put(COLUNA_CONTATO_EMPRESTIMOS, contato);

		return mDb.insert(TABLE_EMPRESTIMO, null, values);
	}

	public Date getDataEmprestimo(long idEmprestimo){

		Cursor c = consultarEmprestimo(idEmprestimo);

		Long mili = 0L;
		mili = c.getLong(c.getColumnIndex(DBAdapter.COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS));
		c.close();

		return new Date(mili);
	}

	//SELECT DISTINCT * FROM TABELA_EMPRESTIMOS WHERE COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS>=inicio AND COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS<=fim;
	public Cursor consultarEmprestimosBetween(Date inicio, Date fim) {
		Cursor mCursor =

				mDb.query(
						true,
						TABLE_EMPRESTIMO,
						null,
						COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS + ">=? AND "
								+ COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS + "<=?",
								new String[] { String.valueOf(inicio.getTime()),
								String.valueOf(fim.getTime()) }, null, null, null, null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;

	}

	public boolean removerEmprestimo(long idEmprestimo) {

		return mDb.delete(TABLE_EMPRESTIMO, COLUNA_ID_EMPRESTIMOS + "=?",
				new String[] { String.valueOf(idEmprestimo) }) > 0;
	}

	// Retorna TUDO que estiver na tabela Emprestimos. Funciona, mas precisa
	// mesmo passar todas as colunas ? não
	public Cursor consultarTodosEmprestimosV1() {

		return mDb.query(TABLE_EMPRESTIMO, new String[] {
				COLUNA_ID_EMPRESTIMOS, COLUNA_ITEM_EMPRESTIMOS,
				COLUNA_DESCRICAO_EMPRESTIMOS,
				COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS, COLUNA_STATUS_EMPRESTIMOS,
				COLUNA_STATUS_ALARME_EMPRESTIMOS,
				COLUNA_ID_CATEGORIA_EMPRESTIMOS, COLUNA_ID_CONTATO_EMPRESTIMOS,
				COLUNA_CONTATO_EMPRESTIMOS }, null, null, null, null, null);
	}

	// Retorna TUDO que estiver na tabela Emprestimos, assim como o método V1,
	// mas é bem mais simples.
	public Cursor consultarTodosEmprestimosV2() {

		return mDb.query(TABLE_EMPRESTIMO, null, null, null, null, null, null);
	}

	public Cursor consultarEmprestimo(long idEmprestimo) throws SQLException {

		Cursor mCursor =

				mDb.query(true, TABLE_EMPRESTIMO, null, COLUNA_ID_EMPRESTIMOS + "=?",
						new String[] { String.valueOf(idEmprestimo) }, null, null,
						null, null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;

	}

	public Cursor consultarEmprestimosPorCategoria(long idCategoria)
			throws SQLException {

		Cursor mCursor =

				mDb.query(true, TABLE_EMPRESTIMO, null,
						COLUNA_ID_CATEGORIA_EMPRESTIMOS + "=?",
						new String[] { String.valueOf(idCategoria) }, null, null, null,
						null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;

	}

	public List<Date> consultarQuantosEmprestimosBetween(Date inicio, Date fim) {
		List<Date> datas = new ArrayList<Date>();

		Cursor mCursor = consultarEmprestimosBetween(inicio, fim);
		while (!mCursor.isAfterLast()) {
			Long mili = mCursor
					.getLong(mCursor
							.getColumnIndex(DBAdapter.COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS));

			datas.add(new Date(mili));
			mCursor.moveToNext();
		}
		mCursor.close();

		return datas;

	}

	public boolean atualizarEmprestimo(long idEmprestimo, String item,
			String descricao, boolean statusEmprestimo, Date devolucao,
			boolean statusAlarme, long idCategoria, long idContato,
			String contato) {

		ContentValues values = new ContentValues();

		values.put(COLUNA_ITEM_EMPRESTIMOS, item);
		values.put(COLUNA_DESCRICAO_EMPRESTIMOS, descricao);
		values.put(COLUNA_STATUS_EMPRESTIMOS,
				statusEmprestimo ? STATUS_EMPRESTAR : STATUS_PEGAR_EMPRESTADO);
		values.put(COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS, devolucao.getTime());
		values.put(COLUNA_STATUS_ALARME_EMPRESTIMOS,
				statusAlarme ? STATUS_ALARME_LIGADO : STATUS_ALARME_DESLIGADO);
		values.put(COLUNA_ID_CATEGORIA_EMPRESTIMOS, idCategoria);
		values.put(COLUNA_ID_CONTATO_EMPRESTIMOS, idContato);
		values.put(COLUNA_CONTATO_EMPRESTIMOS, contato);

		return mDb.update(TABLE_EMPRESTIMO, values, COLUNA_ID_EMPRESTIMOS
				+ "=?", new String[] { String.valueOf(idEmprestimo) }) > 0;
	}

	public long getNumeroDeEmprestimos() {
		return DatabaseUtils.queryNumEntries(mDb, TABLE_EMPRESTIMO);
	}


}
